package utils

import (
	"bytes"
	"io"
)

func ReadAll(r io.Reader, capacity int64) (b []byte, err error) {
	var buf bytes.Buffer

	// 如果字节缓冲区在读取过程中一直扩容，最终超出了系统设置的最大容量，会产生 ErrTooLarge panic，在这里捕获，改为返回一个 error
	// 如果是其他类型的 panic，保持 panic
	defer func() {
		e := recover()
		if e == nil {
			return
		}
		if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge {
			err = panicErr
		} else {
			panic(e)
		}
	}()

	// 设置默认容量
	if int64(int(capacity)) == capacity {
		buf.Grow(int(capacity))
	}

	// 读取数据
	_, err = buf.ReadFrom(r)
	return buf.Bytes(), err
}

type nopCloser struct {
	io.Reader
}

func (nopCloser) Close() error { return nil }

// NopCloser 传入一个 io.Reader 类型，返回 io.ReadCloser 类型
func NopCloser(r io.Reader) io.ReadCloser {
	return nopCloser{r}
}
